home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 2.iso / STUTTGART / UNIXTOOL / UNIXLIB37B / !UnixLib37_src_sys_s__exec < prev    next >
Encoding:
Text File  |  1996-11-09  |  4.8 KB  |  256 lines

  1. ;----------------------------------------------------------------------------
  2. ;
  3. ; $Source: /unixb/home/unixlib/source/unixlib37/src/sys/s/RCS/_exec,v $
  4. ; $Date: 1996/11/06 22:01:42 $
  5. ; $Revision: 1.3 $
  6. ; $State: Rel $
  7. ; $Author: unixlib $
  8. ;
  9. ; $Log: _exec,v $
  10. ; Revision 1.3  1996/11/06 22:01:42  unixlib
  11. ; Yet more changes by NB, PB and SC.
  12. ;
  13. ; Revision 1.2  1996/10/30 21:59:00  unixlib
  14. ; Massive changes made by Nick Burret and Peter Burwood.
  15. ;
  16. ; Revision 1.1  1996/04/19 21:34:32  simon
  17. ; Initial revision
  18. ;
  19. ;----------------------------------------------------------------------------
  20.  
  21.     GET    Unix37:unixlib.s.asm_dec
  22.  
  23.     AREA    |C$$code|,CODE,READONLY
  24.  
  25.     IMPORT    |__exret|
  26.  
  27.     IMPORT    |__base|
  28.     IMPORT    |__rwlimit|
  29.     IMPORT    |__dynamic_num|
  30.     IMPORT    |__break|
  31.  
  32.     IMPORT    |__exerr|
  33.     IMPORT    |raise|
  34.     IMPORT    |_exit|
  35.  
  36. |__exec_s0|
  37.  
  38. |__exec_s1|
  39.     MOV    v1,a1
  40.     ADR    a1,|__exreg|
  41.     STMIA    a1,{sl,fp,sp}
  42.  
  43.     MOV    a1,#11
  44.     ADR    a2,|__exec_s4|
  45.     MOV    a3,#0
  46.     MOV    a4,#0
  47.     SWI    XOS_ChangeEnvironment
  48.     STR    a2,[pc,#|__o_exit|-.-8]
  49.  
  50.     LDR    a1,[pc,#|__base_ptr|-.-8]
  51.     LDR    a1,[a1,#0]
  52.     STR    a1,[pc,#|__base_|-.-8]
  53.     LDR    a2,[pc,#|__rwlimit_ptr|-.-8]
  54.     LDR    a2,[a2,#0]
  55.     STR    a2,[pc,#|__rwlimit_|-.-8]
  56.     ; save __break and __dynamic_num for later since they could get
  57.     ; corrupted by the code shift below
  58.     LDR    a4,[pc,#|__break_ptr|-.-8]
  59.     LDR    a4,[a4,#0]
  60.     STR    a4,[pc,#|__break_|-.-8]
  61.     LDR    a4,[pc,#|__dynamic_num_ptr|-.-8]
  62.     LDR    a4,[a4,#0]
  63.     STR    a4,[pc,#|__dynamic_num_|-.-8]
  64.     LDR    a3,[pc,#|__codeshift|-.-8]
  65.  
  66.     [ PARANOID = 1
  67.     CMP    a3,#0
  68.     MOVEQ    a3,a1            ; no code shift required, so set
  69.     BEQ    |__exec_s3|        ; a3 to base (what else?)
  70.     ]
  71.  
  72.     ADD    a3,a2,a3
  73.  
  74.     SUB    a1,a2,a1
  75.     ANDS    a4,a1,#31
  76.     BEQ    |__exec_s2_1|
  77. |__exec_s2_0|
  78.     LDR    ip,[a2,#-4]!
  79.     STR    ip,[a3,#-4]!
  80.     SUB    a1,a1,#4
  81.     ANDS    a4,a1,#31
  82.     BNE    |__exec_s2_0|
  83. |__exec_s2_1|
  84.     CMP    a1,#0
  85.     BEQ    |__exec_s3|
  86. |__exec_s2_2|
  87.     LDMDB    a2!,{a4,v2,v3,v4,v5,v6,sl,ip}
  88.     STMDB    a3!,{a4,v2,v3,v4,v5,v6,sl,ip}
  89.     SUBS    a1,a1,#64
  90.     LDMGEDB a2!,{a4,v2,v3,v4,v5,v6,sl,ip}
  91.     STMGEDB a3!,{a4,v2,v3,v4,v5,v6,sl,ip}
  92.     BGT    |__exec_s2_2|
  93.  
  94. |__exec_s3|
  95.     ; save dynamic area information four times at top of application
  96.     ; memory so it can be validated in new image
  97.     ; start of area for spawned programs = __break
  98.     LDR    a4,[pc,#|__break_|-.-8]
  99.     EOR    v3,a4,a4,ROR #7
  100.     EOR    v5,a4,a4,ROR #13
  101.     EOR    sl,a4,a4,ROR #23
  102.     LDR    v2,[pc,#|__dynamic_num_|-.-8]
  103.     EOR    v4,v2,v2,ROR #7
  104.     EOR    v6,v2,v2,ROR #13
  105.     EOR    ip,v2,v2,ROR #23
  106.     [ |__4K_BOUNDARY| = 1
  107.     ; align top of wimpslot to 4k (downwards)
  108.     SUB    a3,a3,#32
  109.     BIC    a3,a3,#&ff
  110.     BIC    a3,a3,#&f00
  111.     ADD    a3,a3,#32
  112.     ]
  113.     STMDB    a3!,{a4,v2,v3,v4,v5,v6,sl,ip}
  114.  
  115.     MOV    a1,#0
  116.     MOV    a2,a3
  117.     MOV    a3,#0
  118.     MOV    a4,#0
  119.     SWI    XOS_ChangeEnvironment
  120.     STR    a2,[pc,#|__o_himem|-.-8]
  121.  
  122.     MOV    a1,v1
  123.     SWI    XOS_CLI
  124.     MOVVC    a1,#0
  125.     STR    a1,[pc,#|__exerr_|-.-8]
  126.  
  127. |__exec_s4|
  128.     MOV    a1,#0
  129.     LDR    a2,[pc,#|__o_himem|-.-8]
  130.     MOV    a3,#0
  131.     MOV    a4,#0
  132.     SWI    XOS_ChangeEnvironment
  133.  
  134.     LDR    a3,[pc,#|__base_|-.-8]
  135.     LDR    a1,[pc,#|__rwlimit_|-.-8]
  136.     LDR    a2,[pc,#|__codeshift|-.-8]
  137.     [ PARANOID = 1
  138.     CMP    a2,#0
  139.     BEQ    |__exec_s6|
  140.     ]
  141.  
  142.     ADD    a1,a1,a2
  143.     ADD    a2,a3,a2
  144.  
  145.     SUB    a1,a1,a2
  146.     ANDS    a4,a1,#31
  147.     BEQ    |__exec_s5_1|
  148. |__exec_s5_0|
  149.     LDR    ip,[a2],#4
  150.     STR    ip,[a3],#4
  151.     SUB    a1,a1,#4
  152.     ANDS    a4,a1,#31
  153.     BNE    |__exec_s5_0|
  154. |__exec_s5_1|
  155.     CMP    a1,#0
  156.     BEQ    |__exec_s6|
  157. |__exec_s5_2|
  158.     LDMIA    a2!,{a4,v2,v3,v4,v5,v6,sl,ip}
  159.     STMIA    a3!,{a4,v2,v3,v4,v5,v6,sl,ip}
  160.     SUBS    a1,a1,#64
  161.     LDMGEIA a2!,{a4,v2,v3,v4,v5,v6,sl,ip}
  162.     STMGEIA a3!,{a4,v2,v3,v4,v5,v6,sl,ip}
  163.     BGT    |__exec_s5_2|
  164.  
  165. |__exec_s6|
  166.     ; Flush instruction cache for StrongARM. Use RWLimit rather
  167.     ; than ROLimit in case some code is in the data section
  168.     MOV    a1,#1
  169.     LDR    a2,[pc,#|__base_|-.-8]
  170.     LDR    a3,[pc,#|__rwlimit_|-.-8]
  171.     SWI    XOS_SynchroniseCodeAreas
  172.  
  173.     MOV    a1,#11
  174.     LDR    a2,[pc,#|__o_exit|-.-8]
  175.     MOV    a3,#0
  176.     MOV    a4,#0
  177.     SWI    XOS_ChangeEnvironment
  178.  
  179.     LDR    a1,[pc,#|__exerr_ptr|-.-8]
  180.     LDR    a2,[pc,#|__exerr_|-.-8]
  181.     STR    a2,[a1,#0]
  182.  
  183.     ADR    a1,|__exreg|
  184.     LDMIA    a1,{sl,fp,sp}
  185.  
  186.     LDR    a1,[pc,#|__exret_ptr|-.-8]
  187.     LDR    a2,[pc,#|__base_|-.-8]
  188.     CMP    a1,a2
  189.     BCC    |__exec_rtn_corrupt|
  190.     BIC    a2,a1,#3
  191.     CMP    a1,a2
  192.     BNE    |__exec_rtn_corrupt|
  193.     MOV    pc,a1
  194. |__exec_rtn_corrupt|
  195.     ADR    a1,|__exec_rtn_msg|
  196.     SWI    XOS_Write0
  197.     SWI    XOS_NewLine
  198.     MOV    a1,#SIGABRT
  199.     BL    raise        ; should never return
  200.     MOV    a1, #1
  201.     B    |_exit|        ; but just in case
  202. |__exec_rtn_msg|
  203.     DCB    "return from exec() not possible, return point corrupted", 0
  204.     ALIGN
  205.  
  206. |__o_exit|
  207.     DCD    0    ; old Exit Handler
  208. |__o_himem|
  209.     DCD    0    ; old HIMEM
  210. |__exret_ptr|
  211.     DCD    |__exret|
  212. |__base_ptr|
  213.     DCD    |__base|
  214. |__base_|
  215.     DCD    0    ; __base value
  216. |__rwlimit_ptr|
  217.     DCD    |__rwlimit|
  218. |__rwlimit_|
  219.     DCD    0    ; __rwlimit value
  220. |__exreg|
  221.     %    12    ; sl,fp,sp
  222. |__exerr_ptr|
  223.     DCD    |__exerr|
  224. |__exerr_|
  225.     DCD    0
  226. |__dynamic_num_ptr|
  227.     DCD    |__dynamic_num|
  228. |__dynamic_num_|
  229.     DCD    0    ; __dynamic_num value
  230. |__break_ptr|
  231.     DCD    |__break|
  232. |__break_|
  233.     DCD    0    ; __break value
  234.  
  235.     EXPORT    |__exshift|
  236. |__exshift|
  237.     DCD    0
  238.     EXPORT    |__codeshift|
  239. |__codeshift|
  240.     DCD    0
  241.  
  242. |__exec_s7|
  243.  
  244.     EXPORT    |__exptr|
  245. |__exptr|
  246.     DCD    |__exec_s0|
  247.     EXPORT    |__exlen|
  248. |__exlen|
  249.     [ |__4K_BOUNDARY| = 1
  250.     DCD    (|__exec_s7|-|__exec_s0| + 4095) :AND: -4096
  251.     |
  252.     DCD    |__exec_s7|-|__exec_s0|
  253.     ]
  254.  
  255.     END
  256.